<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/3/11 0011
 * Time: 19:35
 */
//https://blog.csdn.net/u014659211/article/details/51072790
//进程间通信(Inter-Process Messaging, IPC)
//int ftok ( string pathname, string proj )
//ftok将一个路径名pathname和一个项目名(必须为一个字符), 转化成一个整形的用来使用系统V IPC的key

//Ticks是从PHP 4.0.3开始才加入到PHP中的，它是一个在 declare 代码段中解释器每执行 N 条低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。
//function getStatus($arg)
//{
//    print_r(connection_status());
//    debug_print_backtrace();
//}
//
//register_tick_function('getStatus', true);
////register_tick_function('getStatus', true);
//declare(ticks=1){
//    for($i =1; $i<999; $i++){
////        echo "hello\n";
////        echo "$i\n";
////        getStatus(true);
//    }
//}
//unregister_tick_function('getStatus');

$msg_key = ftok(__DIR__, 'm');
//echo $msg_key;
$msg_id = msg_get_queue($msg_key, 0666);
function fetchMessage($msg_id)
{
    if (!is_resource($msg_id)) {
        print_r("Mesg Queue is not Ready");
    }
    //第二个参数是0 应该是接收所有的意思 ，或者必须和msg_send的第二个参数相同
    if (msg_receive($msg_id, 0, $meg_type, 1024, $message, false, MSG_IPC_NOWAIT)) {
        print_r("Process got a new incoming MSG: $message \n");
    }
}

register_tick_function('fetchMessage', $msg_id);//
declare(ticks=2){
    $i = 0;
    while (++$i < 100) {
        if ($i % 5 == 0) {
            msg_send($msg_id,1,$i);
        }
    }
}
msg_remove_queue($msg_id);
//已经对怎么模拟PHP为事件驱动已经有了一个概念了